// 类
export { }

//属性的定义

//1.基本的类属性创建和声明 
class Person {
    public name: string
    private age: number // = 18 //可以初始化一个值，也可以在 constructor中通过参数来赋值；
    protected gender: boolean
    constructor(name: string, age: number) {
        this.name = name //在constructor中使用this来添加属性，会有语法 错误，要在class中，添加属性；
        this.age = age
        this.gender = true
    }

    sayHi(msg: string): void {
        console.log(`i am ${this.name}, ${msg}`)
        console.log(this.age)
        console.log(this.gender)  //Person类中可以访问
    }

}
// 实例对象 
const tom = new Person('tom', 12)
console.log(tom.name)
// console.log(tom.age) //不能访问私有的属性  private age:number
// console.log(tom.gender)//属性“gender”受保护，只能在类“Person”及其子类中访问。


// 2子类的属性继承

/* class Student extends Person{
    constructor(name:string, age:number){
        super(name, age)
        // console.log(this.age)//属性“age”为私有属性，只能在类“Person”中访问
        console.log(this.gender)//子类中可以访问
    }
} */

/* class Student extends Person{
//如果让constructor，变成private，不能使用new来实例化对象 ；只能在内部创建一个static方法
    private constructor(name:string, age:number){
        super(name, age)
        // console.log(this.age)//属性“age”为私有属性，只能在类“Person”中访问
        console.log(this.gender)//子类中可以访问
    }

    // 静态方法  
    static create(name:string, age: number){
        return new Student(name,age)
    }
}
 
const jack = Student.create('jack',23)
*/


class Student extends Person {
    //如果让constructor，变成protected，不能使用new来实例化对象 ；
    protected constructor(name: string, age: number) {
        super(name, age)
        // console.log(this.age)//属性“age”为私有属性，只能在类“Person”中访问
        console.log(this.gender)//子类中可以访问
    }

    // 4 静态方法  
    static create(name: string, age: number) {
        return new Student(name, age)
    }
}

// const eason = new Student() //同样不可以在外面被实例化，只可以在内部访问，还可以被子类继承。